﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using RESTScrum.Dominio;
using System.Data.SqlClient;
using System.Messaging;

namespace RESTScrum.Persistencia
{
    public class EncuestaDAO
    {
        string rutaCola = @".\private$\encuesta";
           
        public string Crear(Encuesta encuestaACrear)
        {
            encuestaACrear.Estado = "A";
            string retorno = "";
            if (!MessageQueue.Exists(rutaCola))
                MessageQueue.Create(rutaCola);
            
                try
                {
                    MessageQueue cola = new MessageQueue(rutaCola);
                    Message mensaje = new Message();
                    mensaje.Label = "Nueva Encuesta";
                    mensaje.Body = new Encuesta()
                    {
                        Codigo = encuestaACrear.Codigo,
                        Reserva = encuestaACrear.Reserva,
                        puntajeRespuesta1 = encuestaACrear.puntajeRespuesta1,
                        puntajeRespuesta2 = encuestaACrear.puntajeRespuesta2,
                        puntajeRespuesta3 = encuestaACrear.puntajeRespuesta3,
                        observaciones = encuestaACrear.observaciones,
                        Estado = encuestaACrear.Estado,
                    };
                    cola.Send(mensaje);
                    retorno = "OK";
                }
                catch(Exception ex)
                {
                    retorno = ex.Message;
                }
            return retorno;
        }

        public Encuesta Obtener(string codigo)
        {
            Encuesta EncuestaEncontrada = null;
            string sql = "SELECT * FROM encuesta WHERE codigo=@cod and estado='A'";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@cod", codigo));
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        if (resultado.Read())
                        {
                            EncuestaEncontrada = new Encuesta()
                            {
                                Codigo = (string)resultado["Codigo"],
                                Reserva = (string)resultado["Reserva"],
                                puntajeRespuesta1 = (string)resultado["puntajeRespuesta1"],
                                puntajeRespuesta2 = (string)resultado["puntajeRespuesta2"],
                                puntajeRespuesta3 = (string)resultado["puntajeRespuesta3"],
                                observaciones = (string)resultado["observaciones"],
                                Estado = (string)resultado["Estado"]
                            };
                        }
                    }
                }

            }
            return EncuestaEncontrada;
        }

        public Encuesta Modificar(Encuesta encuestaAModificar)
        {
            Encuesta encuestaModificado = null;
            string sql = "UPDATE encuesta SET nombre=@nom WHERE codigo=@cod";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    com.Parameters.Add(new SqlParameter("@cod", encuestaAModificar.Codigo));
                    com.Parameters.Add(new SqlParameter("@res", encuestaAModificar.Reserva));
                    com.Parameters.Add(new SqlParameter("@p1", encuestaAModificar.puntajeRespuesta1));
                    com.Parameters.Add(new SqlParameter("@p2", encuestaAModificar.puntajeRespuesta2));
                    com.Parameters.Add(new SqlParameter("@p3", encuestaAModificar.puntajeRespuesta3));
                    com.Parameters.Add(new SqlParameter("@obs", encuestaAModificar.observaciones));
                    com.ExecuteNonQuery();
                }
            }
            encuestaModificado = Obtener(encuestaAModificar.Codigo);
            return encuestaModificado;
        }

        public void Eliminar()
        {
            Encuesta encuestaACrear = null;
            Encuesta encuestaCreada = null;
            MessageQueue cola = new MessageQueue(rutaCola);
            cola.Formatter = new XmlMessageFormatter(new Type[] { typeof(Encuesta) });
            int cantidad = cola.GetAllMessages().Length;
            Message mensaje = null;
            Encuesta p = new Encuesta();
            for (int i = 0; i < cantidad; i++)
            {
                mensaje = cola.Receive();
                encuestaACrear = (Encuesta)mensaje.Body;
                string sql = "INSERT INTO encuesta (codigo,reserva,puntajerespuesta1,puntajerespuesta2,puntajerespuesta3,observaciones,estado) values (@cod, @res, @p1, @p2, @p3, @obs, @est)";
                using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
                {
                    con.Open();
                    using (SqlCommand com = new SqlCommand(sql, con))
                    {
                        com.Parameters.Add(new SqlParameter("@cod", encuestaACrear.Codigo));
                        com.Parameters.Add(new SqlParameter("@res", encuestaACrear.Reserva));
                        com.Parameters.Add(new SqlParameter("@p1", encuestaACrear.puntajeRespuesta1));
                        com.Parameters.Add(new SqlParameter("@p2", encuestaACrear.puntajeRespuesta2));
                        com.Parameters.Add(new SqlParameter("@p3", encuestaACrear.puntajeRespuesta3));
                        com.Parameters.Add(new SqlParameter("@obs", encuestaACrear.observaciones));
                        com.Parameters.Add(new SqlParameter("@est", encuestaACrear.Estado));
                        com.ExecuteNonQuery();
                    }
                }
            }
            encuestaCreada = Obtener(encuestaACrear.Codigo);
        }

        public List<Encuesta> ListarTodos()
        {
            Encuesta encuestaEncontrado = null;
            List<Encuesta> lista = new List<Encuesta>();
            string sql = "select * from encuesta where estado='A'";
            using (SqlConnection con = new SqlConnection(ConexionUtil.Cadena))
            {
                con.Open();
                using (SqlCommand com = new SqlCommand(sql, con))
                {
                    using (SqlDataReader resultado = com.ExecuteReader())
                    {
                        while (resultado.Read())
                        {
                            encuestaEncontrado = new Encuesta()
                            {
                                Codigo = (string)resultado["Codigo"],
                                Reserva = (string)resultado["Reserva"],
                                puntajeRespuesta1 = (string)resultado["puntajeRespuesta1"],
                                puntajeRespuesta2 = (string)resultado["puntajeRespuesta2"],
                                puntajeRespuesta3 = (string)resultado["puntajeRespuesta3"],
                                observaciones = (string)resultado["observaciones"],
                                Estado = (string)resultado["Estado"]
                            };

                            lista.Add(encuestaEncontrado);

                        }
                    }
                }
            }
            return lista;
        }

    }
}